{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 简介\n",
    "\n",
    "赛题链接：https://challenge.xfyun.cn/topic/info?type=Ad-click-through"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 赛事背景\n",
    "\n",
    "广告点击率预估是在线广告交易的核心环节之一，如果说一家公司想知道 CTR（点击率），以确定将他们的钱花在数字广告上是否值得。点击率高表示对该特定广告系列更感兴趣，点击率低可能表明广告可能不那么相关。高点击率表明更多人点击了网站，这有利于在谷歌、必应等在线平台上以更少的钱获得更好的广告位置。\n",
    "\n",
    "近年来，各大有关广告点击率预估的比赛相拥而至，如腾讯广告算法大赛、科大讯飞营销算法大赛、阿里妈妈点击率预估大赛等。可以看出这是一个企业长期关注的问题，也是值得花时间探索的问题。\n",
    "\n",
    "## 赛事任务\n",
    "平台展示给用户特定的广告，用户存在点击与不点击两种行为。给定某平台实际广告业务中的用户行为数据，共包含13个用户相关的字段，其中isClick字段表明用户是否会点击广告。\n",
    "\n",
    "任务目标是通过训练集训练模型，来预测测试集中isClick字段的概率结果，即用户点击平台所推荐广告的概率，以此为依据，表示用户对特定广告感兴趣的程度。\n",
    "\n",
    "## 评审规则\n",
    "\n",
    "1. 数据说明\n",
    "\n",
    "赛题数据由训练集和测试集组成，包含13个特征字段，6天的数据。其中39万多条作为训练集（7月2-6日），7万多条作为测试集（7月7日），同时会对部分字段信息进行脱敏。\n",
    "\n",
    "\n",
    "<img src=\"./pic/data.png\" width = \"300\" height = \"150\" alt=\"data\" align=center />\n",
    " \n",
    "\n",
    "2. 评估指标\n",
    "\n",
    "本次竞赛的评价标准采用AUC指标，正样本为1，评估代码参考：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_auc_score\n",
    "y_true = [0, 1, 0, 1, 1, 1]\n",
    "y_pred = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
    "score = roc_auc_score(y_true, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "3. 评测及排行\n",
    "\n",
    "1、赛事提供下载数据，选手在本地进行算法调试，在比赛页面提交结果。\n",
    "\n",
    "2、每支团队每天最多提交3次。\n",
    "\n",
    "3、排行按照得分从高到低排序，排行榜将选择团队的历史最优成绩进行排名。\n",
    "\n",
    "## 作品提交要求\n",
    "\n",
    "文件格式：预测结果文件按照csv格式提交\n",
    "\n",
    "文件大小：无要求\n",
    "\n",
    "提交次数限制：每支队伍每天最多3次\n",
    "\n",
    "预测结果文件详细说明：\n",
    "\n",
    "1) 以csv格式提交，编码为UTF-8，第一行为表头；\n",
    "\n",
    "2) 提交前请确保预测结果的格式与sample_submit.csv中的格式一致。具体格式如下：\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "id,isClick\n",
    "\n",
    "463291,0.5\n",
    "\n",
    "463292,0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 赛程规则\n",
    "\n",
    "正式赛\n",
    "\n",
    "8月9日——9月8日\n",
    "\n",
    "初赛截止成绩以团队在初赛时间段内最优成绩为准（不含测试排名）。\n",
    "\n",
    "初赛作品提交截止日期为9月8日17:00；正式赛名次公布日期为9月9日10:00。\n",
    "\n",
    "长期赛\n",
    "\n",
    "9月9日——10月24日\n",
    "\n",
    "因赛事以学习实践为主，正式赛将转变为长期赛，供开发者学习实践。本阶段提交后，系统会根据成绩持续更新榜单，但该阶段榜单不再进行公示和奖励。\n",
    "\n",
    "六、奖项设置\n",
    "本赛题设立一、二、三等奖各一名，具体详情如下：\n",
    "\n",
    "一等奖：1支队伍，周赛一等奖证书，奖金：1000元\n",
    "\n",
    "二等奖：1支队伍，周赛二等奖证书，奖金：800元\n",
    "\n",
    "三等奖：1支队伍，周赛三等奖证书，奖金：500元"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 赛题Baseline\n",
    "\n",
    "## 导入常用工具包&读取数据\n",
    "\n",
    "### 常用工具包导入\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:54:27.643226Z",
     "start_time": "2021-08-08T12:54:25.916825Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import glob\n",
    "from joblib import Parallel, delayed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "### 数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:54:28.528061Z",
     "start_time": "2021-08-08T12:54:28.079308Z"
    }
   },
   "outputs": [],
   "source": [
    "data_path = './data/'\n",
    "\n",
    "df_tr    = pd.read_csv(data_path + 'train.csv')\n",
    "df_te    = pd.read_csv(data_path + 'test.csv')\n",
    "df_tr_te = pd.concat([df_tr,df_te],axis=0,ignore_index = True)\n",
    "df_tr_te['isClick'] = df_tr_te['isClick'].fillna(-1)\n",
    "df_sub   = pd.read_csv(data_path + 'sample_submit.csv') "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:54:29.336275Z",
     "start_time": "2021-08-08T12:54:29.319522Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>date</th>\n",
       "      <th>user_id</th>\n",
       "      <th>product</th>\n",
       "      <th>campaign_id</th>\n",
       "      <th>webpage_id</th>\n",
       "      <th>product_category_id</th>\n",
       "      <th>user_group_id</th>\n",
       "      <th>gender</th>\n",
       "      <th>age_level</th>\n",
       "      <th>user_depth</th>\n",
       "      <th>var_1</th>\n",
       "      <th>isClick</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>07-02 00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>Female</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>07-02 00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>8.0</td>\n",
       "      <td>Female</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>07-02 00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>Female</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>07-02 00:00</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>3.0</td>\n",
       "      <td>Male</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>07-02 00:01</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Male</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id         date  user_id  product  campaign_id  webpage_id  \\\n",
       "0   0  07-02 00:00        0        0            0           0   \n",
       "1   1  07-02 00:00        1        0            1           1   \n",
       "2   2  07-02 00:00        1        0            0           0   \n",
       "3   3  07-02 00:00        2        1            0           0   \n",
       "4   4  07-02 00:01        3        0            2           2   \n",
       "\n",
       "   product_category_id  user_group_id  gender  age_level  user_depth  var_1  \\\n",
       "0                    0           10.0  Female        4.0         3.0      0   \n",
       "1                    1            8.0  Female        2.0         2.0      0   \n",
       "2                    0            8.0  Female        2.0         2.0      0   \n",
       "3                    2            3.0    Male        3.0         3.0      1   \n",
       "4                    2            2.0    Male        2.0         3.0      1   \n",
       "\n",
       "   isClick  \n",
       "0      0.0  \n",
       "1      0.0  \n",
       "2      0.0  \n",
       "3      0.0  \n",
       "4      0.0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_tr_te.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:57:59.447438Z",
     "start_time": "2021-08-08T12:57:58.836036Z"
    }
   },
   "outputs": [],
   "source": [
    "df_tr_te['hour'] = df_tr_te['date'].apply(lambda x: int(x.split(' ')[-1].split(':')[0]))\n",
    "df_tr_te['day']= df_tr_te['date'].apply(lambda x: int(x.split(' ')[0].split('-')[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### userid\n",
    "\n",
    "- userid的分布是有偏的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T13:07:43.335106Z",
     "start_time": "2021-08-08T13:07:42.024116Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/wangrong/opt/anaconda3/lib/python3.8/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
      "  warnings.warn(msg, FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='user_id', ylabel='Density'>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "from tqdm import tqdm\n",
    "from sklearn.model_selection import KFold \n",
    "import lightgbm as lgbm \n",
    "\n",
    "sns.distplot(df_tr_te['user_id'].value_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### user_group_id\n",
    "\n",
    "- user_group_i的分布主要集中在1，2，3，4，5。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T13:45:08.018489Z",
     "start_time": "2021-08-08T13:45:07.795966Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_tr_te['user_group_id'].value_counts().plot(kind='bar')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### day\n",
    "\n",
    "- 每天的数据是类似的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:58:15.568387Z",
     "start_time": "2021-08-08T12:58:15.344909Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_tr_te['day'].value_counts().plot(kind = 'bar')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### isClick\n",
    "\n",
    "- 标签分布有些不平衡；"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T13:37:47.333082Z",
     "start_time": "2021-08-08T13:37:47.198960Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_tr['isClick'].value_counts().plot(kind = 'bar')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "- 每一天用户的点击率会有些许差异，但大致都在0.06-0.075之间。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T13:01:37.954622Z",
     "start_time": "2021-08-08T13:01:37.580571Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='day'>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_tr_te.loc[df_tr_te['isClick']!=-1].groupby('day')['isClick'].mean().plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T13:01:16.716204Z",
     "start_time": "2021-08-08T13:01:16.697187Z"
    }
   },
   "source": [
    "### 小结\n",
    "\n",
    "从上面的基础分析来看，本次赛题的数据基本符合我们的直观理解。至于其它的细节，大家可以根据自己的需求进行分析。下面我们构建该赛题的Baseline。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:19:43.122811Z",
     "start_time": "2021-08-08T12:19:43.093323Z"
    }
   },
   "source": [
    "## 模型构建\n",
    "### 特征工程\n",
    "\n",
    "#### 历史点击率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:20:08.583964Z",
     "start_time": "2021-08-08T12:20:08.566492Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "\n",
    "def _his_click_rate(df, f1, window_size = 2): \n",
    "    fea_name = '{}_his_{}_clickrate'.format(f1,window_size )\n",
    "    df[fea_name] = 0\n",
    "    for i in tqdm(range(3,8)):\n",
    "        df_t = df.loc[((df['day'] >= i-window_size) & (df['day'] < i))]\n",
    "        inds = df['day'] == i\n",
    "        df.loc[inds,fea_name] = df.loc[inds,f1].map(df_t.groupby(f1)['isClick'].mean()) \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:20:09.592062Z",
     "start_time": "2021-08-08T12:20:09.149892Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 5/5 [00:00<00:00, 13.85it/s]\n"
     ]
    }
   ],
   "source": [
    "df_tr_te = _his_click_rate(df = df_tr_te, f1 = 'user_id', window_size = 2)\n",
    "df_tr_te['gender'] = df_tr_te['gender'].fillna('NAN').map({'Female':1,'Male':0,'NAN':-1})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:23:49.840993Z",
     "start_time": "2021-08-08T12:23:49.838892Z"
    }
   },
   "source": [
    "#### 历史count特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:23:52.059678Z",
     "start_time": "2021-08-08T12:23:51.918878Z"
    }
   },
   "outputs": [],
   "source": [
    "dense_features = ['user_id_his_2_clickrate']\n",
    "for c in ['user_id','product','hour','campaign_id','webpage_id','user_group_id','age_level']:\n",
    "    df_tr_te[c + '_cnt'] = df_tr_te[c].map(df_tr_te[c].value_counts())\n",
    "    dense_features.append(c + '_cnt')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:24:31.990819Z",
     "start_time": "2021-08-08T12:24:31.988238Z"
    }
   },
   "source": [
    "## 模型训练&预测\n",
    "\n",
    "### 五折LGB模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:23:53.943770Z",
     "start_time": "2021-08-08T12:23:53.939694Z"
    }
   },
   "outputs": [],
   "source": [
    "cate_features  = ['user_id','product','hour','campaign_id','webpage_id','user_group_id','age_level']\n",
    "dense_features = dense_features + ['gender']\n",
    "label          = 'isClick'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:39:34.418296Z",
     "start_time": "2021-08-08T12:37:01.700267Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/wangrong/opt/anaconda3/lib/python3.8/site-packages/lightgbm/engine.py:153: UserWarning: Found `early_stopping_rounds` in params. Will use it instead of argument\n",
      "  _log_warning(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
      "/Users/wangrong/opt/anaconda3/lib/python3.8/site-packages/lightgbm/basic.py:1705: UserWarning: categorical_feature in Dataset is overridden.\n",
      "New categorical_feature is ['age_level', 'campaign_id', 'hour', 'product', 'user_group_id', 'user_id', 'webpage_id']\n",
      "  _log_warning('categorical_feature in Dataset is overridden.\\n'\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Number of positive: 21190, number of negative: 292270\n",
      "[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.019503 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 19300\n",
      "[LightGBM] [Info] Number of data points in the train set: 313460, number of used features: 16\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.067600 -> initscore=-2.624149\n",
      "[LightGBM] [Info] Start training from score -2.624149\n",
      "Training until validation scores don't improve for 100 rounds\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/wangrong/opt/anaconda3/lib/python3.8/site-packages/lightgbm/basic.py:1433: UserWarning: Overriding the parameters from Reference Dataset.\n",
      "  _log_warning('Overriding the parameters from Reference Dataset.')\n",
      "/Users/wangrong/opt/anaconda3/lib/python3.8/site-packages/lightgbm/basic.py:1245: UserWarning: categorical_column in param dict is overridden.\n",
      "  _log_warning('{} in param dict is overridden.'.format(cat_alias))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100]\ttraining's auc: 0.658613\tvalid_1's auc: 0.602978\n",
      "[200]\ttraining's auc: 0.668796\tvalid_1's auc: 0.605539\n",
      "[300]\ttraining's auc: 0.67614\tvalid_1's auc: 0.60634\n",
      "[400]\ttraining's auc: 0.681604\tvalid_1's auc: 0.606225\n",
      "Early stopping, best iteration is:\n",
      "[304]\ttraining's auc: 0.676372\tvalid_1's auc: 0.606431\n",
      "[LightGBM] [Info] Number of positive: 21074, number of negative: 292386\n",
      "[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.004578 seconds.\n",
      "You can set `force_row_wise=true` to remove the overhead.\n",
      "And if memory is not enough, you can set `force_col_wise=true`.\n",
      "[LightGBM] [Info] Total Bins 19334\n",
      "[LightGBM] [Info] Number of data points in the train set: 313460, number of used features: 16\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.067230 -> initscore=-2.630035\n",
      "[LightGBM] [Info] Start training from score -2.630035\n",
      "Training until validation scores don't improve for 100 rounds\n",
      "[100]\ttraining's auc: 0.65511\tvalid_1's auc: 0.6083\n",
      "[200]\ttraining's auc: 0.663173\tvalid_1's auc: 0.609098\n",
      "[300]\ttraining's auc: 0.669479\tvalid_1's auc: 0.609489\n",
      "[400]\ttraining's auc: 0.674937\tvalid_1's auc: 0.609987\n",
      "[500]\ttraining's auc: 0.679823\tvalid_1's auc: 0.610264\n",
      "[600]\ttraining's auc: 0.684235\tvalid_1's auc: 0.610657\n",
      "[700]\ttraining's auc: 0.690073\tvalid_1's auc: 0.610448\n",
      "Early stopping, best iteration is:\n",
      "[634]\ttraining's auc: 0.686012\tvalid_1's auc: 0.610664\n",
      "[LightGBM] [Info] Number of positive: 21222, number of negative: 292238\n",
      "[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.018158 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 19461\n",
      "[LightGBM] [Info] Number of data points in the train set: 313460, number of used features: 16\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.067702 -> initscore=-2.622530\n",
      "[LightGBM] [Info] Start training from score -2.622530\n",
      "Training until validation scores don't improve for 100 rounds\n",
      "[100]\ttraining's auc: 0.654584\tvalid_1's auc: 0.614179\n",
      "[200]\ttraining's auc: 0.663667\tvalid_1's auc: 0.616451\n",
      "[300]\ttraining's auc: 0.670593\tvalid_1's auc: 0.616915\n",
      "[400]\ttraining's auc: 0.67607\tvalid_1's auc: 0.617391\n",
      "[500]\ttraining's auc: 0.681162\tvalid_1's auc: 0.617944\n",
      "[600]\ttraining's auc: 0.685192\tvalid_1's auc: 0.618239\n",
      "[700]\ttraining's auc: 0.688914\tvalid_1's auc: 0.618267\n",
      "[800]\ttraining's auc: 0.692953\tvalid_1's auc: 0.618294\n",
      "Early stopping, best iteration is:\n",
      "[777]\ttraining's auc: 0.692339\tvalid_1's auc: 0.618385\n",
      "[LightGBM] [Info] Number of positive: 22166, number of negative: 291294\n",
      "[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.021973 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 19571\n",
      "[LightGBM] [Info] Number of data points in the train set: 313460, number of used features: 16\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.070714 -> initscore=-2.575773\n",
      "[LightGBM] [Info] Start training from score -2.575773\n",
      "Training until validation scores don't improve for 100 rounds\n",
      "[100]\ttraining's auc: 0.659786\tvalid_1's auc: 0.591016\n",
      "[200]\ttraining's auc: 0.669031\tvalid_1's auc: 0.592811\n",
      "[300]\ttraining's auc: 0.675552\tvalid_1's auc: 0.593582\n",
      "[400]\ttraining's auc: 0.680773\tvalid_1's auc: 0.593581\n",
      "Early stopping, best iteration is:\n",
      "[364]\ttraining's auc: 0.67894\tvalid_1's auc: 0.59363\n",
      "[LightGBM] [Info] Number of positive: 22068, number of negative: 291392\n",
      "[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.005255 seconds.\n",
      "You can set `force_row_wise=true` to remove the overhead.\n",
      "And if memory is not enough, you can set `force_col_wise=true`.\n",
      "[LightGBM] [Info] Total Bins 19522\n",
      "[LightGBM] [Info] Number of data points in the train set: 313460, number of used features: 16\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.070401 -> initscore=-2.580541\n",
      "[LightGBM] [Info] Start training from score -2.580541\n",
      "Training until validation scores don't improve for 100 rounds\n",
      "[100]\ttraining's auc: 0.658561\tvalid_1's auc: 0.582069\n",
      "[200]\ttraining's auc: 0.667721\tvalid_1's auc: 0.584812\n",
      "[300]\ttraining's auc: 0.675033\tvalid_1's auc: 0.585932\n",
      "[400]\ttraining's auc: 0.679941\tvalid_1's auc: 0.586605\n",
      "[500]\ttraining's auc: 0.684729\tvalid_1's auc: 0.587181\n",
      "[600]\ttraining's auc: 0.68876\tvalid_1's auc: 0.587857\n",
      "[700]\ttraining's auc: 0.691905\tvalid_1's auc: 0.588088\n",
      "[800]\ttraining's auc: 0.695499\tvalid_1's auc: 0.587947\n",
      "Early stopping, best iteration is:\n",
      "[700]\ttraining's auc: 0.691905\tvalid_1's auc: 0.588088\n"
     ]
    }
   ],
   "source": [
    "\n",
    "lgb_params = {\n",
    "      \"objective\": \"binary\", \n",
    "      \"metric\": \"auc\", \n",
    "      \"boosting_type\": \"gbdt\",\n",
    "      'early_stopping_rounds': 100,\n",
    "      'learning_rate': 0.01,  \n",
    "      'colsample_bytree':0.95, \n",
    "}\n",
    "features = cate_features + dense_features\n",
    "X_tr_val = df_tr_te.loc[df_tr_te['isClick']!=-1] \n",
    "X_te     = df_tr_te.loc[df_tr_te['isClick']==-1][features]\n",
    " \n",
    "kf = KFold(n_splits=5)\n",
    "lgb_models = []\n",
    "y_pred = 0\n",
    "for f,(tr_ind,val_ind) in enumerate(kf.split(X_tr_val)):\n",
    "    \n",
    "    X_train,X_valid = X_tr_val.iloc[tr_ind][features], X_tr_val.iloc[val_ind][features]\n",
    "    y_train,y_valid = X_tr_val.iloc[tr_ind][label], X_tr_val.iloc[val_ind][label]\n",
    "    \n",
    "    lgbm_train = lgbm.Dataset(X_train,y_train)  \n",
    "    lgbm_valid = lgbm.Dataset(X_valid,y_valid)\n",
    "\n",
    "    model_binary = lgbm.train(params=lgb_params, \n",
    "                  train_set=lgbm_train,\n",
    "                  valid_sets=[lgbm_train, lgbm_valid],\n",
    "                  num_boost_round=100000,   \n",
    "                  verbose_eval=100,\n",
    "                  categorical_feature = cate_features)\n",
    "    y_pred = model_binary.predict(X_te) / 5.0\n",
    "    lgb_models.append(model_binary)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型提交"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:42:57.262496Z",
     "start_time": "2021-08-08T12:42:57.218460Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>isClick</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>391825</td>\n",
       "      <td>0.026866</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>391826</td>\n",
       "      <td>0.021046</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>391827</td>\n",
       "      <td>0.014573</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>391828</td>\n",
       "      <td>0.011582</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>391829</td>\n",
       "      <td>0.017713</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id   isClick\n",
       "0  391825  0.026866\n",
       "1  391826  0.021046\n",
       "2  391827  0.014573\n",
       "3  391828  0.011582\n",
       "4  391829  0.017713"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub = pd.DataFrame({'id':df_tr_te.loc[df_tr_te['isClick']==-1]['id'].values, 'isClick':y_pred})\n",
    "sub.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-08T12:43:18.064593Z",
     "start_time": "2021-08-08T12:43:17.866383Z"
    }
   },
   "outputs": [],
   "source": [
    "sub.to_csv('baseline_Fold5_lgb.csv',index = None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 结论\n",
    "\n",
    "本文我们对数据进行了简单的分析，同时构建了count和历史点击率两大特征，最终使用5折的交叉LGB进行训练预测。当然本次比赛还有很多其它的提升点，例如：\n",
    " \n",
    "- 细化特征分析，构建其它的特征，包括交叉特征等等；\n",
    "- 构建现在常见的网络模型，尝试最新的神经网络；\n",
    "- 使用不同的模型进行融合等等；\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
